import tracker from '../utils/tracker';
export function injectXHR() {
    let XMLHttpRequest = window.XMLHttpRequest;
    let oldOpen = XMLHttpRequest.prototype.open; // 存储老的open方法
    XMLHttpRequest.prototype.open = function(method, url, async) { // 在XMLHttpRequest原型上增强open方法
        if (!url.match(/logstores/) && !url.match(/sockjs/)) { // 排除上报的接口，如果是上报的接口 就不进行监控
            this.logData = { method, url, async }; //在初始化请求的时候 劫持相关的数据，在send的时候使用
        }
        return oldOpen.apply(this, arguments);
    }
    let oldSend = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(body) {
            if (this.logData) {
                let startTime = Date.now(); //在发送之前记录一下开始的时间
                /**
                 * function fn(x) {
                      return function(y) {
                          return x+y;
                      }
                  }
                  const fn = x => y => x+y
                 */
                let handler = (type) => (event) => {
                    let duration = Date.now() - startTime; // 当前时间-开始时间，可以得到持续的时间
                    let status = this.status; //200 500
                    let statusText = this.statusText; // OK Server Error
                    tracker.send({
                        kind: 'stability',
                        type: 'xhr',
                        eventType: type, //load error abort
                        pathname: this.logData.url, //请求路径
                        status: status + '-' + statusText, //状态码
                        duration, //持续时间
                        response: this.response ? JSON.stringify(this.response) : '', //响应体
                        params: body || ''
                    });
                }
                this.addEventListener('load', handler('load'), false); //监听请求完成时 触发的load 事件
                this.addEventListener('error', handler('error'), false);
                this.addEventListener('abort', handler('abort'), false); // 请求被终止了
            }
            return oldSend.apply(this, arguments);
        }
        // if (window.fetch) {
        //     TODO: fetch逻辑
        // }
}